# Do nothing if ActiveSupport is present.
unless defined?(ActiveSupport)
  
  # ActiveSupport is not loaded.
  # However, we still need <tt>extract_options!</tt>
  #
  class Hash
    # By default, only instances of Hash itself are extractable.
    # Subclasses of Hash may implement this method and return
    # true to declare themselves as extractable. If a Hash
    # is extractable, Array#extract_options! pops it from
    # the Array when it is the last element of the Array.
    def extractable_options?
      instance_of?(Hash)
    end
  end

  class Array
    # Extracts options from a set of arguments. Removes and returns the last
    # element in the array if it's a hash, otherwise returns a blank hash.
    #
    #   def options(*args)
    #     args.extract_options!
    #   end
    #
    #   options(1, 2)           # => {}
    #   options(1, 2, :a => :b) # => {:a=>:b}
    def extract_options!
      if last.is_a?(Hash) && last.extractable_options?
        pop
      else
        {}
      end
    end
  end
end